#include <stdio.h>
// 设置默认对齐数为1
#pragma pack(1)
struct S3
{
    double d;
    char c;
    int i;
};
// 取消设置的默认对齐数
#pragma pack(0)

struct S4
{
    char c1;
    struct S3 s3;
    double d;
};

// int main()
// {
//     // 结构体第一个成员在与结构体变量了、偏移量为0的地址处
//     // 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
//     // 对齐数=编译器默认的一个对齐数与该成员自身大小的较小值
//     // 如果嵌套了结构体的情况，嵌套的结构体对齐到自己的最大对齐数的整数倍处，结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

//     // 结构体总大小为最大对齐数的整数倍
//     printf("%zu\n", sizeof(struct S3));
//     printf("%zu\n", sizeof(struct S4));
//     return 0;
// }
// 结构体的内存对齐是拿空间换时间的做法

// struct S
// {
//     int data[1000];
//     int num;
// };
// void print1(struct S t)
// {
//     printf("%d %d %d %d\n", t.data[0], t.data[1], t.data[2], t.num);
// }
// //保护结构体不被ps修改
// void print2(const struct S *ps)
// {
//     printf("%d %d %d %d\n", ps->data[0], ps->data[1], ps->data[2], ps->num);
// }
// int main()
// {
//     struct S s = {{1, 2, 3}, 100};
//     print1(s);  // 传值调用
//     print2(&s); // 传址调用
//     return 0;
// }

// struct A
// {
//     int _a : 2;
//     int _b : 5;
//     int _c : 10;
//     int _d : 30;
// };

// int main()
// {
//     printf("%d\n", sizeof(struct A));
//     return 0;
// }

// 常量：字母常量，#define定义的标识符常量，const修饰的常变量，枚举常量

// 枚举定义
enum Sex
{
    // 枚举的可能取值
    MALE,
    FEMALE,
    SECRET
};